package com.zqweb.gulimall.seckill.schedule;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class HelloSchedule {
    // 定时任务测试
    /*
        Spring中使用定时任务：（自动配置类：TaskSchedulingAutoConfiguration）
         1）在定时任务的方法上标注@Scheduled(cron = "cron表达式")注解，前提是要在组件中标注@EnableScheduling
         2）Spring中使用定时任务，其cron表达式的星期1~星期7，分别用1~7表示，而且只能表示6位，不包含年份
         3）定时任务一般是不会阻塞的，但是可能会发生阻塞，如手动制造睡眠、服务不稳定超时阻塞等，所以一般要杜绝阻塞现象：
            解决方案：（使用到异步任务，自动配置类：TaskExecutionAutoConfiguration）
            1、使用CompletableFuture异步编排任务的方式
            2、在核心配置文件中配置spring.task.scheduling.pool.size = xxx大小，即声明任务调度线程池的大小 > 1，
               可给会产生阻塞的定时任务分配多个线程，减少阻塞（这种方案的有效性看SpringBoot版本支持等情况的）我的机器不支持
            3、在会产生阻塞的定时任务方法上标注@Async注解，前提是要在组件中标注@EnableAsync。同时也可在核心配置文件中
               配置任务调度线程池的参数情况，如：
               spring.task.execution.pool.core-size、spring.task.execution.pool.max-size
     */
    @Scheduled(cron = "* * * * * 4") // 开启一个定时任务
    @Async // 开启一个异步任务
    public void scheduleTest1() throws InterruptedException {
        log.info("今天是星期四...");
        Thread.sleep(3000);
    }

}
